import chardet
import re
import io


def read_header(file_path, max_lines=100):
    """
    LAS/CSV/TXT 文件表头读取器（自动识别文件类型）

    支持：
    - LAS 格式（~CURVE INFORMATION 节区提取）
    - CSV/TXT 格式（自动识别 \t, ,, |, 空格 分隔符）
    - 中文注释跳过
    - 混合节区结构

    参数:
        file_path (str): 文件路径
        max_lines (int): 最多读取的行数（用于判断表头）

    返回:
        list: 表头字段列表，失败返回 None
    """
    # 1. 读取原始数据并检测编码
    with open(file_path, 'rb') as f:
        raw_data = f.read()

    # 自动检测编码
    result = chardet.detect(raw_data[:1024])
    encoding = result['encoding'] if result['confidence'] > 0.9 else 'gbk'
    print(f"检测到的编码: {encoding}, 置信度: {result['confidence']:.2f}")

    # 2. 读取文件内容为行列表
    lines = raw_data.decode(encoding).splitlines()
    print("文件前5行内容:")
    for i, line in enumerate(lines[:5]):
        print(f"    {i + 1}: {line.strip()}")

    # 3. 判断是否为 LAS 格式
    is_las = any(line.strip().startswith('~CURVE INFORMATION') for line in lines)
    print(f"文件类型: {'LAS' if is_las else '非 LAS'}")

    # 4. LAS 格式处理（~CURVE INFORMATION 节区提取）
    if is_las:
        in_curve_section = False
        header = []

        for line in lines[:max_lines]:
            stripped = line.strip()
            if not stripped:
                continue

            # 进入 CURVE 节区
            if stripped.startswith('~CURVE INFORMATION'):
                in_curve_section = True
                continue

            # 跳过字段分隔线
            if in_curve_section and stripped.startswith('#----'):
                continue

            # 跳过字段描述行
            if in_curve_section and stripped.startswith('#MNEM.UNIT'):
                continue

            # ✅ 改进字段行匹配逻辑（支持空字段名、混合空白、多空格）
            if in_curve_section:
                # 改进后的正则：允许字段名后任意空白 + 冒号 + 描述
                match = re.match(r'^([A-Z0-9]+)(?:\s+.*)*:\s*.*$', stripped)
                if match:
                    # 提取字段名（忽略单位、描述）
                    field_match = re.match(r'^([A-Z0-9]+)', stripped)
                    if field_match:
                        field = field_match.group(1)
                        print(f"提取字段名: {field}")
                        header.append(field)
                    continue
                else:
                    # 如果当前行不满足字段格式，则结束 CURVE 节区
                    in_curve_section = False
                    continue

            # 遇到数据行时停止（如 3517.00000 开头）
            if re.match(r'^\s*\d+(\.\d+)?', stripped):
                break

        if header:
            print(f"LAS 表头提取结果: {header}")
            return header
        else:
            print("未在 LAS 文件中找到有效表头")
            return None

    # 5. 非 LAS 格式处理（CSV/TXT）
    print("尝试通用表头提取（CSV/TXT）...")
    separators = ['\t', ',', '|', ' ', ';']

    for sep in separators:
        print(f"尝试使用分隔符 {repr(sep)} 提取...")
        potential_headers = []

        for line in lines[:5]:  # 尝试前5行
            stripped = line.strip()
            if not stripped:
                continue

            # 跳过数据行（以数字开头）
            if re.match(r'^\s*\d+(\.\d+)?', stripped):
                break

            fields = [f.strip() for f in stripped.split(sep)]
            fields = [f for f in fields if f]  # 去除空字段

            # 如果字段数 >=2 且非纯数字，则视为表头
            if len(fields) >= 2 and not all(re.match(r'^\d+(\.\d+)?$', f) for f in fields):
                print(f"成功提取表头: {fields}")
                return fields

    print("无法提取表头（未找到标准表头结构）")
    return None


# 示例用法
if __name__ == "__main__":
    # 测试文件路径（请替换为你的实际文件）
    # file_path = r"C:\Users\cf\Desktop\3-6井三开综合测井解释数据.txt"
    # file_path = r"C:\Users\cf\Desktop\3-6HF气测.txt"
    file_path = r"C:\Users\zackary\Desktop\3-6HF元素.txt"

    header = read_header(file_path)

    if header:
        print("\n✅ 成功提取表头:")
        print(header)
    else:
        print("\n❌ 无法提取表头")
